Technical Note TN1164
Native Scripting Additions

ñ⁄éü

DZÇÃÉeÉNÉjÉJÉãÉmÅ[ÉgÇ≈ÇÕÅAMac OS 8.6Ç≈ì±ì¸Ç≥ÇÍÇΩAppleScriptÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉÅÉJÉjÉYÉÄÇΔÅAMac OS XópÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇçÏê¨Ç∑ÇÈÇΩÇflÇÃägí£APIDžǬǢǃê‡ñæÇµÇ‹Ç∑ÅB

DZÇÃÉeÉNÉjÉJÉãÉmÅ[ÉgÇÕÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇäJî≠Ç∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÉfÉxÉçÉbÉpå¸ÇØÇ…èëÇ©ÇÍǃǢNjÇ∑ÅB

[2001îN9åé13ì˙]






ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇΔÇÕâΩÇ©?

ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕAppleScriptåæåÍÇÃç\ï∂Çägí£Ç∑ÇÈÉÅÉJÉjÉYÉÄÇíÒãüǵNjÇ∑ÅBÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕAppleÉCÉxÉìÉgÇèàóùÇ∑ÇÈLJÇÃÇΔÅAAppleÉCÉxÉìÉgÉfÅ[É^ÇÃcoercionÇçsǧLJÇÃÇ…ï™ófiÇ≈Ç´Ç‹Ç∑ÅBAppleÉCÉxÉìÉgÇèàóùÇ∑ÇÈÉ^ÉCÉvÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈égÇÌÇÍǃǢÇÈAppleÉCÉxÉìÉgÉnÉìÉhÉâÇΔìØÇ∂óvóÃÇ≈é¿ëïǵNjÇ∑Ç™ÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕì¡éÍÇ»é¿çsä¬ã´Ç…ǮǩÇÍǃǢÇÈÇÃÇ≈ÅAAppleÉCÉxÉìÉgÉnÉìÉhÉâÇ‚ä¬ã´ïœêîÇê≥ǵÇ≠àµÇ§ÇΩÇflÇ…ÇÕÅAçXÇ…éüÇÃÉãÅ[É`ÉìÇé¿ëïÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB

  • ÉCÉxÉìÉgÉnÉìÉhÉâÇ‚coercionÉnÉìÉhÉâÉCÉìÉXÉgÅ[ÉãÅAÉÅÉÇÉäÇÃämï€ÅAÉOÉçÅ[ÉoÉãïœêîÇÃèÄîıǻǫÅAé¿çsÇ…ïKóvÇ»èâä˙âªçÏãΔ

  • ÉXÉNÉäÉvÉeÉBÉìÉOã@î\ägí£ÉçÅ[ÉhÅ^ÉAÉìÉçÅ[ÉhÇÃÉ^ÉCÉ~ÉìÉOÇåàíËÇ∑ÇÈÉäÉtÉ@ÉåÉìÉXÉJÉEÉìÉgÇÃìOíÍ

  • äeéÌÉnÉìÉhÉâÇÃçÌèúÅAçÏãΔóÃàÊÇÃâèúǻǫÇÃèIóπçÏãΔ

ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç…ÇÊǡǃÉCÉìÉXÉgÅ[ÉãÇ≥ÇÍÇÈAppleÉCÉxÉìÉgÉnÉìÉhÉâÇΔAppleÉCÉxÉìÉgÉfÅ[É^coercionÉnÉìÉhÉâÇÕÅAàÍî ìIÇ…ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈égÇÌÇÍÇÈÉnÉìÉhÉâÇΔìØÇ∂ï˚ñ@Ç≈é¿ëïǵNjÇ∑ÅBÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇΔÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃà·Ç¢ÇÕÅAÉRÅ[ÉhÇÃÉpÉbÉPÅ[ÉWÇ≥ÇÍǃǢÇÈï˚ñ@ÇΔÅAé¿çsï˚ñ@Ç≈Ç∑ÅBDZÇÍÇ©ÇÁÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉpÉbÉPÅ[ÉWÇΔé¿çsï˚ñ@DžǬǢǃè⁄ǵÇ≠ê‡ñæÇµÇ‹Ç∑ÅB



ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉpÉbÉPÅ[ÉWâª

ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕ2í ÇËÇÃÉpÉbÉPÅ[ÉWÇ™ë∂ç›ÇµÇ‹Ç∑ÅB

  1. Mach-Oå`éÆÇÃMac OS XÉoÉìÉhÉã

    Mach-Oå`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕMac OS XÉoÉìÉhÉãÇΔǵǃÉpÉbÉPÅ[ÉWâªÇµÇ‹Ç∑ÅBMach-Oå`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡éüÇÃÇ¢Ç∏ÇÍÇ©ÇÃï˚ñ@Ç≈ì¡íËÇ≥ÇÍÇ‹Ç∑ÅB
    1. ÉoÉìÉhÉãÇÃCFBundleSignatureÇ™ÅgosaxÅhÇ≈džÇÈ
    2. ÉoÉìÉhÉãñºÇÃägí£éqÇ™Åg.osaxÅhÇ≈džÇÈ


  2. CFMå`éÆÇÃCarbonLibÇ®ÇÊÇ—InterfaceLibÇ…ÉäÉìÉNÇ≥ÇÍÇΩÉVÉìÉOÉãÉoÉCÉiÉä

    CarbonLibÇ…ÉäÉìÉNÇ≥ÇÍÇΩÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃǛǙMac OS XÇ≈égópÇ≈Ç´Ç‹Ç∑ÅBCFMå`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕÉtÉ@ÉCÉãÉ^ÉCÉvÇΔÉNÉäÉGÅ[É^ÉRÅ[ÉhÇ≈ì¡íËÇ≥ÇÍÇ‹Ç∑ÅBÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕÉtÉ@ÉCÉãÉ^ÉCÉvÇ™ÅeosaxÅfÅAÉNÉäÉGÅ[É^ÉRÅ[ÉhÇÕîƒópìIÇ»ílÅiÅeascrÅfÅjÇ‹ÇΩÇÕÅeBNDLÅfÉäÉ\Å[ÉXÇ≈íËã`Ç≥ÇÍǃǢÇÈílÇ≈džǡǃLJç\ǢNjÇπÇÒÅB

    íêÅF
    InterfaceLibÇ…ÉäÉìÉNÇ≥ÇÍÇΩÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕMac OS XÇ≈égópÇ≈Ç´Ç‹ÇπÇÒÅBCarbonLibÇ…ÉäÉìÉNÇ≥ÇÍÇΩÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕMac OS 9Ç≈à¿ëSÇ…égópÇ≈Ç´Ç‹ÇπÇÒÅB



êÊì™Ç…ñflÇÈ



ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèâä˙âª

ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèâä˙âªÉãÅ[É`ÉìÇ≈ÇÕÅAïKóvÇ»ÉnÉìÉhÉâÇÃÉCÉìÉXÉgÅ[ÉãÅAÉÅÉÇÉäÇÃämï€ÅAǪÇÃëºÇÃèÄîıèàóùÇçsǢNjÇ∑ÅBèâä˙âªÉãÅ[É`ÉìÇÕà»â∫ÇÃÇÊǧDžç\ê¨ÇµÇ‹Ç∑ÅB

  1. GestaltÅAsysctlǻǫÇégǡǃÅAé¿çsÇ…ïKóvÇ»ÉVÉXÉeÉÄÉäÉ\Å[ÉXÇÃë∂ç›ÇämîFǵNjÇ∑ÅBDZDZÇ≈ÇÕÉÅÉÇÉäÇÃämï€Ç‚é¿çsÇ…ïKóvÇ»ÉtÉ@ÉCÉãÇÃämîFLJçsǢNjÇ∑ÅB

  2. AppleÉCÉxÉìÉgÉnÉìÉhÉâÇ‚CoercionÉnÉìÉhÉâÇÉCÉìÉXÉgÅ[ÉãǵNjÇ∑ÅBÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉnÉìÉhÉâÇÕÉVÉXÉeÉÄÉfÉBÉXÉpÉbÉ`ÉeÅ[ÉuÉãÇ…ÉCÉìÉXÉgÅ[ÉãÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBÉäÉXÉg1Ç≈ÇÕÉVÉXÉeÉÄÉfÉBÉXÉpÉbÉ`ÉeÅ[ÉuÉãÇ…ÉnÉìÉhÉâÇÉCÉìÉXÉgÅ[ÉãÇ∑ÇÈï˚ñ@Çè–âÓǵǃǢNjÇ∑ÅB

    ÉäÉXÉg1 ÉVÉXÉeÉÄÉfÉBÉXÉpÉbÉ`ÉeÅ[ÉuÉãÇ…ÉnÉìÉhÉâÇÉCÉìÉXÉgÅ[ÉãÇ∑ÇÈ

         Boolean isSysHandler = true;
    
         anErr = AEInstallEventHandler( theAEEventClass, theAEEventID,
                                 theHandlerUPP, refcon, isSysHandler);
                                 
         anErr = AEInstallCoercionHandler( fromType, toType, theHandlerUPP,
                                 refcon, fromTypeIsDesc, isSysHandler);
    
    


    èdóvÅF
    èâä˙âªÉãÅ[É`ÉìÇ≈noErrà»äOÇÃñflÇËílÇï‘Ç∑èÍçáÇÕÅAÉnÉìÉhÉâÇÉCÉìÉXÉgÅ[ÉãǵǻǢDZÇΔÇ™äÃóvÇ≈Ç∑ÅBä˘Ç…ÉCÉìÉXÉgÅ[ÉãÇ≥ÇÍǃǵNjǡǃǢÇÈèÍçáÇÕÉnÉìÉhÉâÇäOǵNjÇ∑ÅB



  3. íËêîÇÃèâä˙âªÇ‚èâä˙âªÉãÅ[É`ÉìÉpÉâÉÅÅ[É^ÇÃï€ë∂ǻǫÅAǪÇÃëºÇÃèâä˙ê›íËÇçsǢNjÇ∑ÅB

ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèâä˙âªÉãÅ[É`ÉìÇÕÉpÉbÉPÅ[ÉWï˚ñ@Ç…ÇÊǡǃÅAé¿ëïï˚ñ@Ç™àŸÇ»ÇËÇ‹Ç∑ÅBCFMå`éÆÇÃèÍçáÅACode FragmentÇÃèâä˙âªÉãÅ[É`ÉìÇ™égópÇ≥ÇÍÇ‹Ç∑ÅBàÍï˚ÅAMach-Oå`éÆÇÃèÍçáÅAÅgSAInitializeÅhÇΔåæÇ§ÉãÅ[É`ÉìÇíËã`ǵǃÅAÉGÉLÉXÉ|Å[ÉgÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB

CFMå`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèÍçáÇÕÅACode FragmentÇÃèâä˙âªÉãÅ[É`ÉìÇ™åƒÇŒÇÍÇ‹Ç∑ÅBÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕÅAèâä˙âªÉãÅ[É`Éìà»äOÇÃÇΔDZÇÎÇ≈é©ï™ÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ≠DZÇΔǙdžÇÍÇŒÅAèâä˙âªÉãÅ[É`Éìì‡Ç≈éÊìæÇµÇΩÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ÷ÇÃéQèΔÇÉOÉçÅ[ÉoÉãïœêîǻǫDžï€ë∂ǵNjÇ∑ÅBÉäÉXÉg2ÇÕCFMå`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèâä˙âªÉãÅ[É`ÉìÇÃó·Ç≈Ç∑ÅB



ÉäÉXÉg2 CFMå`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèâä˙âªÉãÅ[É`Éì

OSErr CFMSAInitialize(InitBlockPtr initBlkPtr) {
    OSErr err;

    ...DZDZÇ≈èâä˙âªÇçsǧ...
    
    return err;
}



ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèâä˙âªÉãÅ[É`ÉìÇ…ìnÇ≥ÇÍÇÈinitBlkPtrÉpÉâÉÅÅ[É^ÇÕÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇéQèΔÇ∑ÇÈÇΩÇflÇÃèÓïÒÇ™ä‹Ç‹ÇÍǃǢNjÇ∑ÅBèâä˙âªÉãÅ[É`Éìà»äOÇÃÉnÉìÉhÉâÇ≈é©ï™ÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ≠èÍçáÇÕÅAéQèΔèÓïÒÇÉOÉçÅ[ÉoÉãïœêîǻǫDžï€ë∂ǵǃǮǴNjÇ∑ÅBÉäÉXÉg3Ç≈ÇÕÉGÉCÉäÉAÉXÇÉOÉçÅ[ÉoÉãïœêîÇ…ï€ë∂ǵǃǢNjÇ∑ÅB



ÉäÉXÉg3 CFMå`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèâä˙âªÉãÅ[É`Éì

static AliasHandle gMyAdditionLocation;

OSErr CFMSAInitialize( InitBlockPtr initBlkPtr ) {
    OSErr err;

    /* DZÇÃÉãÅ[É`Éìà»äOÇÃÇΔDZÇÎÇ≈é©ï™ÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ≠
       DZÇΔǙdžÇÍÇŒÅAÉOÉçÅ[ÉoÉãïœêîÇ…ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡
       ÉtÉ@ÉCÉãÇ÷ÇÃéQèΔÇï€ë∂ǵNjÇ∑ÅB */

    err = NewAlias( NULL, initBlkPtr->fragLocator.u.onDisk.fileSpec,
                    &gMyAdditionLocation);
    if( err == noErr ) ...
    
    return err;
}



Mach-Oå`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕÅgSAInitializeÅhÇΔåæÇ§ä÷êîÇÉGÉLÉXÉ|Å[ÉgÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBDZÇÃä÷êîÇÕÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡èâä˙âªéûÇ…åƒÇŒÇÍÇ‹Ç∑ÅBÉäÉXÉg4Ç≈ÇÕMach-OÇÃèâä˙âªä÷êîÇÃàÍó·Çé¶ÇµÇ‹Ç∑ÅB



ÉäÉXÉg4 Mach-Oå`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèâä˙âªä÷êî

OSErr SAInitialize( CFBundleRef additionBundle ) {
    OSErr err;
    
    ...DZDZÇ≈èâä˙âªÇçsǧ...
    
    return err;
}



SAInitializeÇÃadditionBundleÉpÉâÉÅÅ[É^ÇÕÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉoÉìÉhÉãÇéwǵNjÇ∑ÅBDZÇÃílÇégǡǃÅAÉoÉìÉhÉãì‡ÇÃÉäÉ\Å[ÉXÇ…ÉAÉNÉZÉXÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBDZÇÃílÇÉOÉçÅ[ÉoÉãïœêîǻǫDžï€ë∂Ç∑ÇÍÇŒÅAèâä˙âªéûà»äOÇÃÉnÉìÉhÉâÇ≈ÉoÉìÉhÉãì‡ÇÃÉäÉ\Å[ÉXÇ…ÉAÉNÉZÉXÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBadditionBundleÇÕÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç™ÉçÅ[ÉhÇ≥ÇÍǃǢÇÈä‘óLå¯Ç≈Ç∑ÇÃÇ≈ÅACFRetainÇåƒÇ—èoÇ∑ïKóvÇÕdžÇËÇ‹ÇπÇÒÅB

CFMå`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèÍçáÅACode FragmentÇÃèâä˙âªÉãÅ[É`ÉìÇÃñºëOÇéwíËÇ∑ÇÈï˚ñ@ÇÕäJî≠ä¬ã´Ç…àÀë∂ǵNjÇ∑ÇÃÇ≈ÅAäJî≠ä¬ã´ÇÃê‡ñæèëÇÇ®ì«Ç›â∫Ç≥Ç¢ÅBCode Fragment ManagerÅACFMÇÃèâä˙âªÉãÅ[É`ÉìÅAMach-ODžǬǢǃÇÕDZÇÃå„ÇÃéQçlï∂å£ÇÇ≤óóâ∫Ç≥Ç¢ÅB

êÊì™Ç…ñflÇÈ



ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèIóπ

èIóπÉãÅ[É`ÉìÇ≈ÇÕÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇèIóπÇ≥ÇπÇÈÇΩÇflÇ…ïKóvÇ»èàóùÇçsǢNjÇ∑ÅBì¡Ç…ÅAéüÇÃèàóùÇåáÇ©Ç≥Ç∏Ç…çsǧïKóvǙdžÇËÇ‹Ç∑ÅB

  • èâä˙âªÉãÅ[É`ÉìÇ≈ÉCÉìÉXÉgÅ[ÉãǵÇΩÉCÉxÉìÉgÉnÉìÉhÉâÇ‚coercionÉnÉìÉhÉâÇçÌèúÇ∑ÇÈ

  • ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç≈äÑÇËìñǃÇΩÉÅÉÇÉäÇ‚ÉäÉ\Å[ÉXÇâèúÇ∑ÇÈ

ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèIóπÉãÅ[É`ÉìÇÕÅAAppleScriptÇ™ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇΔÇÃê⁄ë±ÇÉNÉçÅ[ÉYÇ∑ÇÈÇΔÇ´Ç…åƒÇ—èoÇ≥ÇÍÇ‹Ç∑ÅBDZÇÃÇÊǧǻê⁄ë±ÇÃÉNÉçÅ[ÉYÇÕÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç™ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÉtÉHÉãÉ_Ç©ÇÁäOÇ≥ÇÍÇΩå„ÅAAppleScriptÇ™éüÇ…èâä˙âªÇ≥ÇÍÇΩÉ^ÉCÉ~ÉìÉOÇ≈Ç∑ÅB

ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉçÅ[ÉhÇ‚ÉAÉìÉçÅ[ÉhÇÕÅggdutÅhÉCÉxÉìÉgÇ™éÛóùÇ≥ÇÍÇΩÉ^ÉCÉ~ÉìÉOÇ≈çsÇÌÇÍÇ‹Ç∑ÅBAppleScriptÇÕÉRÉìÉ|Å[ÉlÉìÉgÇ÷ÇÃê⁄ë±Ç™äJÇ¢ÇΩå„ÅAÉXÉNÉäÉvÉgÇÉRÉìÉpÉCÉãÇ∑ÇÈëOÇ…ÉçÅ[ÉhÇ‚ÉAÉìÉçÅ[ÉhÇçsǢNjÇ∑ÅBÇΩÇæÇµÅAÉVÉXÉeÉÄèIóπéûÇ…ÉAÉìÉçÅ[ÉhÇÕçsÇÌÇÍǻǢÇÃÇ≈ÅAèIóπÉãÅ[É`ÉìÇ™é¿ç€Ç…åƒÇŒÇÍÇÈÇÃÇÕÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç™ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÉtÉHÉãÉ_Ç©ÇÁäOÇ≥ÇÍÇΩå„Ç…ÅAç≈èâÇ…ÅggdutÅhÉCÉxÉìÉgÇ™ìûíBǵÇΩéûÇÃÇ›Ç≈Ç∑ÅBDZÇÍÇÕMac OS 9Ç‚Mac OS XLJã§í ÇµÇƒÇ¢Ç‹Ç∑Ç™ÅAMac OS XÇÃèÍçáÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕÉvÉçÉZÉXÇ≤ÇΔÇ…ÉAÉìÉçÅ[ÉhÇ≥ÇÍÇ‹Ç∑ÅBÅiÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇéÊÇËèúÇ¢ÇΩdžÇΔÇÕÅAǪÇÃã@î\í«â¡Ç™ÉçÅ[ÉhÇ≥ÇÍǃǢÇΩÇ∑Ç◊ǃÇÃÉvÉçÉZÉXÇ…ëŒÇµÇƒÅggdutÅhÉCÉxÉìÉgÇëóêMǵǻǢÇΔÅAäÆëSÇ…èúãéÇ≈ǴǻǢDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅBMac OS 9ÇÃèÍçáÇÕÅAÇ«ÇÍÇ©1ǬÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ëŒÇµÇƒÅggdutÅhÉCÉxÉìÉgÇëóêMÇ∑ÇÈÇæÇØÇ≈ÅAäÆëSÇ…èúãéÇ≈ǴNjǵÇΩÅBÅj

ÉäÉXÉg5ÇÕÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèIóπÉãÅ[É`ÉìÇÃàÍó·Ç≈Ç∑ÅBÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç™CFMå`éÆÇÃÉoÉCÉiÉäÇΔǵǃíÒãüÇ≥ÇÍǃǢÇÈèÍçáÇÕÅACFMÇÃèIóπÉãÅ[É`ÉìÇÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèIóπÉãÅ[É`ÉìÇ…ê›íËÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç™Mach-Oå`éÆÇÃÉoÉCÉiÉäÇΔǵǃíÒãüÇ≥ÇÍǃǢÇÈèÍçáÅAAppleScriptÇÕÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÉAÉìÉçÅ[ÉhÇ∑ÇÈíºëOÇ…SATerminateÇåƒÇ—Ç‹Ç∑ÅB



ÉäÉXÉg5 ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèIóπÉãÅ[É`ÉìÇÃó·

void SATerminate(void) {    
        
    AERemoveEventHandler(theAEEventClass,
                                 theAEEventID, gTheHandler, true);
                      
    DisposeAEEventHandlerUPP(gTheHandler);
    
    ...ǪÇÃëºÇÃèIóπçÏãΔ...
                                 
}



CFMå`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèÍçáÅAèIóπÉãÅ[É`ÉìÇÃê›íËï˚ñ@ÇÕäJî≠ä¬ã´Ç…ÇÊǡǃàŸÇ»ÇËÇ‹Ç∑ÇÃÇ≈ÅAè⁄ǵÇ≠ÇÕäJî≠ä¬ã´ÇÃê‡ñæèëÇÇ≤óóâ∫Ç≥Ç¢ÅBCFMÉRÅ[ÉhÉtÉâÉOÉÅÉìÉgÅACFMèâä˙âªÉãÅ[É`ÉìÅAÉoÉìÉhÉãÅAMach-Oå`éÆìôÇÃäTîOìIÇ»ê‡ñæÇ…ǬǢǃÇÕÅAéQçlï∂å£Ç‡Ç≤óóâ∫Ç≥Ç¢ÅB



ÉäÉtÉ@ÉåÉìÉXÉJÉEÉìÉg

AppleScriptÇ™ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÉAÉìÉçÅ[ÉhÇ∑ÇÈç€ÅAÇ‹Ç∏ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç™égópíÜǩǫǧǩÇämîFǵNjÇ∑ÅBégópíÜÇÃèÍçáÇÕÉAÉìÉçÅ[ÉhÇ∑ÇÈDZÇΔÇ™Ç≈ǴǻǢÇÃÇ≈ÅAÉAÉìÉçÅ[ÉhÇÕéÊÇËè¡Ç≥ÇÍÇÈÇ©ÅAégópèÛãµÇ…ïœâªÇ™Ç†ÇÈÇ‹Ç≈ë“ÇøèÛë‘Ç…Ç»ÇËÇ‹Ç∑ÅB

AppleScriptÇÕ2ǬÇÃï˚ñ@Ç≈ÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃégópèÛãµÇämîFǵNjÇ∑ÅBCFMå`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕgAdditionReferenceCountÇΔåæÇ§ÉOÉçÅ[ÉoÉãïœêîÇÉGÉLÉXÉ|Å[ÉgǵNjÇ∑ÅBMach-Oå`éÆÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕSAIsBusyÇΔåæÇ§ÉãÅ[É`ÉìÇÉGÉLÉXÉ|Å[ÉgǵNjÇ∑ÅBCFMå`éÆÇ≈égÇÌÇÍǃǢÇÈÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃgAdditionReferenceCountïœêîÇÕÅAÉäÉXÉg6ÇÃSAIsBusyÉãÅ[É`ÉìÇÃåãâ ÇΔìØÇ∂ÇÊǧDžàµÇÌÇÍÇ‹Ç∑ÅBóvñÒÇ∑ÇÈÇΔÅAgAdditionReferenceCountÇ™É[Éçà»äOÇÃèÍçáÅAǪÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕégópíÜÇÃå©Ç»Ç≥ÇÍÅAÉAÉìÉçÅ[ÉhÇ≥ÇÍÇÈDZÇΔÇÕdžÇËÇ‹ÇπÇÒÅB



ÉäÉXÉg6 ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃSAIsBusyÉãÅ[É`ÉìÇÃó·

UInt32  gAdditionReferenceCount = 0;

Boolean SAIsBusy(void) {    
        
    return (gAdditionReferenceCount != 0);
                                 
}



Ç∑Ç◊ǃÇÃAppleÉCÉxÉìÉgÉnÉìÉhÉâÇΔAppleÉCÉxÉìÉgÉfÅ[É^coercionÉnÉìÉhÉâÇ≈ÇÕÅAé¿çséûÇ…gAdditionReferenceCountÇ1ǬëùǂǵÅAèIóπíºëOÇ…1Ǭå∏ÇÁǵNjÇ∑ÅBÉäÉXÉg7ÇÕìTå^ìIÇ»ÉnÉìÉhÉâÉãÅ[É`ÉìÇÃé¿ëïó·Ç≈Ç∑ÅB



ÉäÉXÉg7 gAdditionReferenceCountÇä«óùÇ∑ÇÈìTå^ìIÇ»ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÉnÉìÉhÉâÉãÅ[É`Éì

UInt32  gAdditionReferenceCount = 0;
     
     ....
     
OSErr MyEventHandler(const AppleEvent *ev,
                     AppleEvent *reply,
                     long refcon) {
    OSErr err;
          
        /* é¿çséûÇÕÉäÉtÉ@ÉåÉìÉXÉJÉEÉìÉgÇëùǂǵNjÇ∑ */
    gAdditionReferenceCount++;
          
          ...ÉnÉìÉhÉâÇÃé¿ëïÉRÅ[Éh...
          
        /* èIóπíºëOÇ…ÉäÉtÉ@ÉåÉìÉXÉJÉEÉìÉgÇå∏ÇÁǵNjÇ∑ */
    --gAdditionReferenceCount;
          
    return err;
}
     


êÊì™Ç…ñflÇÈ



ǪÇÃëº



Mac OS XÇÃé¿çsä¬ã´

Mac OS XÇÃé¿çsä¬ã´ÇÃèÍçáÅAÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕAppleScriptÇ…ê⁄ë±Ç∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ãNìÆÇ∑ÇÈìxÇ…ÅAǪÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉAÉhÉåÉXãÛä‘Ç…ÉçÅ[ÉhÇ≥ÇÍÇ‹Ç∑ÅBDZÇÃÇÊǧDžÅAàÍǬÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç™àÍìxÇ…ï°êîÉçÅ[ÉhÇ≥ÇÍÇÈDZÇΔLJdžÇÈÇÃÇ≈ÅAÉvÉäÉìÉ^Ç‚ÉVÉäÉAÉãÉ|Å[ÉgǻǫÇÃÉVÉXÉeÉÄÉäÉ\Å[ÉXÇégópÇ∑ÇÈèÍçáÇÕÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ä‘Ç≈ã§óLÇ∑ÇÈDZÇΔLJëzíËÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB



ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÉoÉìÉhÉãÉäÉ\Å[ÉXÇÃéÊìæï˚ñ@

Mach-OÉoÉìÉhÉãå`éÆÇ≈íÒãüÇ≥ÇÍǃǢÇÈÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕÅAÉoÉìÉhÉãì‡ÇÃÉäÉ\Å[ÉXÇ‚ÉtÉ@ÉCÉãÇ…ÉAÉNÉZÉXÇ∑ÇÈDZÇΔǙdžÇËÇ‹Ç∑ÅBDZÇÃèÍçáÇÕÅASAInitializeÇ≈éÛÇØéÊÇ¡ÇΩCFBundleRefÇï€ë∂ǵǃÅAÉnÉìÉhÉâì‡Ç≈óòópǵNjÇ∑ÅB



CFBundleRef gMyAdditionBundle;

OSErr SAInitialize(CFBundleRef additionBundle) {
    
        /* ÉnÉìÉhÉâì‡Ç≈ÉoÉìÉhÉãì‡ÇÃÉäÉ\Å[ÉXÇ…ÉAÉNÉZÉXÇ∑ÇÈèÍçáÇÕ
        DZDZÇ≈ÉoÉìÉhÉãÇ÷ÇÃÉäÉtÉ@ÉåÉìÉXÇï€ë∂ǵNjÇ∑ */
    gMyAdditionBundle = additionBundle;
    
    ....
    


ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç≈ÇÕÅAéÛÇØéÊÇ¡ÇΩÉoÉìÉhÉãÉäÉtÉ@ÉåÉìÉXÇ…ëŒÇµÇƒCFRetainÇåƒÇ‘ïKóvÇÕdžÇËÇ‹ÇπÇÒÅBéÛÇØéÊÇ¡ÇΩÉoÉìÉhÉãÉäÉtÉ@ÉåÉìÉXÇÕÉXÉNÉäÉvÉeÉBÉìÉOã@î\ägí£Ç™äJǢǃǢÇÈå¿ÇËÅiSATerminateÇ™åƒÇŒÇÍÇÈÇ‹Ç≈ÅjóLå¯Ç≈Ç∑ÅB

ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉoÉìÉhÉãì‡ÇÃå¬ÅXÇÃÉäÉ\Å[ÉXÇ÷ÇÃÉAÉNÉZÉXï˚ñ@DžǬǢǃÇÕDZÇÃå„ÇÃéQçlï∂å£ÇÇ≤óóâ∫Ç≥Ç¢ÅB



ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇÃéÊìæï˚ñ@

íPàÍÇÃCFMÉtÉ@ÉCÉãÇΔǵǃíÒãüÇ≥ÇÍǃǢÇÈÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÕÅAÉnÉìÉhÉâé¿çsíÜÇ…ÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇ÷ÇÃÉAÉNÉZÉXÇ™ïKóvÇΔÇ»ÇÈDZÇΔÇ™ëΩÅXdžÇËÇ‹Ç∑ÅBèâä˙âªÉãÅ[É`Éìé¿çséûÇ…ÉtÉ@ÉCÉãÇÃFSSpecÇï€ë∂Ç∑ÇÈDZÇΔÇ≈ÅAå„íˆÉäÉ\Å[ÉXÇ™ïKóvÇΔǻǡÇΩéûì_Ç≈ÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJǢǃÉfÅ[É^ÇÉçÅ[ÉhÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB

Code Fragment ManagerÇ™èâä˙âªÉãÅ[É`ÉìÇåƒÇ—èoÇ∑ç€ÇÕÅAèâä˙âªÉãÅ[É`ÉìÇ…ìnÇ≥ÇÍÇÈCFragInitBlockì‡Ç…FSSpecÇ÷ÇÃÉ|ÉCÉìÉ^Çó\Çflê›íËǵǃǢNjÇ∑ÅBÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç≈ÇÕÅADZÇÃÉ|ÉCÉìÉ^ÇÉOÉçÅ[ÉoÉãïœêîÇ…ï€ë∂ǵǃǮÇ≠ÇΔï÷óòÇ≈Ç∑ÅB



AliasHandle gMyAdditionLocation;

OSErr ConnectionInitializationRoutine(InitBlockPtr initBlkPtr) {
    OSErr err;
    
        /* å„íˆÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇïKóvÇΔÇ∑ÇÈ
        èÍçáÇÕDZDZÇ≈ÉtÉ@ÉCÉãÇÃFSSpecÇÉOÉçÅ[ÉoÉãïœêîÇ…ï€ë∂ǵNjÇ∑ÅB */
    err = NewAlias(NULL,
                   initBlkPtr->fragLocator.u.onDisk.fileSpec,
                   &gMyAdditionLocation);
    if (err == noErr) {



ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡Ç™ÉnÉìÉhÉâì‡Ç≈äJÇ¢ÇΩÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇÕÅAÉnÉìÉhÉâèIóπéûÇ‹Ç≈Ç…ÉNÉçÅ[ÉYÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBÇ‹ÇΩÅAÉnÉìÉhÉâì‡Ç≈ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇäJÇ≠èÍçáÅAÉäÉ\Å[ÉXÉ`ÉFÅ[ÉìÇïœçXǵǻǢÇÊǧǻçHïvÇ™ïKóvÇ≈Ç∑ÅBà»â∫ÇÃó·Ç≈ÇÕÅAÉnÉìÉhÉâì‡Ç≈ÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇäJÇ´ÅAÉäÉ\Å[ÉXÉ`ÉFÅ[ÉìÇÃèÛë‘Çï€ë∂ǵǃǢNjÇ∑ÅB



     SInt16    oldResFile;
     SInt16    osaxResRef;
     FSRef     ref;
     
     oldResFile = CurResFile();
     osaxResRef = FSOpenResFile( &ref, fsRdPerm );

     // DZDZÇ≈ÉäÉ\Å[ÉXÇÃì«Ç›çûǛǻǫÇÃèàóùÇçsǧ

     CloseResFile( osaxResRef );
     UseResFile( oldResFile );


íêÅF
ÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇì¡íËÇ∑ÇÈÇΩÇflÇÃÉtÉ@ÉCÉãéQèΔî‘çÜÇÕÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÇÃèâä˙âªÉãÅ[É`ÉìÇ≈éÊìæÇµÇ‹Ç∑ÅB



ÉçÅ[ÉJÉãÉVÉXÉeÉÄÇΔÉäÉÇÅ[ÉgÉVÉXÉeÉÄÇ©ÇÁÇÃÉCÉxÉìÉg

ÉäÉÇÅ[ÉgÉVÉXÉeÉÄÇ©ÇÁÇÃÉCÉxÉìÉgÇåüèoǵǃãëî€Ç∑ÇÈǩǫǧǩÇÕǪÇÍǺÇÍÇÃÉXÉNÉäÉvÉeÉBÉìÉOã@î\í«â¡ÉnÉìÉhÉâÇ™åàíËǵNjÇ∑ÅBÉnÉìÉhÉâÇÕÅAéÛêMǵÇΩÉCÉxÉìÉgÇ…ä‹Ç‹ÇÍÇÈkeyEventSourceAttrëÆê´ÇÉ`ÉFÉbÉNǵǃÅAǪÇÃÉCÉxÉìÉgÇÃÉ\Å[ÉXÇîªífÇ≈Ç´Ç‹Ç∑ÅBÉäÉÇÅ[ÉgÉVÉXÉeÉÄÇ©ÇÁÇÃÉCÉxÉìÉgÇÕÅAkAERemoteProcessÇΔǢǧëÆê´ílÇéùÇøÇ‹Ç∑ÅB



     DescType   sourceAttr;
     DescType   actualType;
     Size       actualSize;

     anErr = AEGetAttributePtr( eventPtr, keyEventSourceAttr, typeType,
                                &actualType, &sourceAttr,
                                sizeof( sourceAttr ), &actualSize);
                                
     if ( sourceAttr == kAERemoteProcess ) {
     
          return errAEEventNotHandled;
          
     }
     

êÊì™Ç…ñflÇÈ



éQçlï∂å£



êÊì™Ç…ñflÇÈ